#pragma once
#include <string>

namespace xpam
{
    namespace regex
    {
        class regex_result
        {
        public:
            std::vector<std::pair<int, int> > matches;
            void add(int pos, int cnt)
            {
                matches.push_back(std::pair<int, int>(pos, cnt));
            }
        };

        class regex_base
        {
        public:
            virtual void match(const std::string & str, regex_result & r) const = 0;
        };

        class chars : public regex_base
        {
            std::string _chars;
        public:
            chars(const std::string & cc) : _chars(cc) { }
            virtual void match(const std::string & str, regex_result & r) const
            {
                for (int i = 0; i < (int)str.size(); i++)
                {
                    for (int j = 0; j < (int)_chars.size(); j++)
                    {
                        if (_chars[j] == str[i])
                        {
                            r.add(i, 1);
                            break;
                        }
                    }
                }
            }
        };

        class multi : public regex_base
        {
            unsigned int _min, _max;
            const regex_base & _rx;
        public:
            multi(const regex_base & rx, unsigned int mn, unsigned int mx) : _rx(rx), _min(mn), _max(mx) { }
            virtual void match(const std::string & str, regex_result & r) const
            {
                //regex_result r1;
                //_rx.match(str, pos, r1);

                //for (int mm = _min; mm <= _max; mm++)
                //{
                //    for (int i = (int)r1.matches.size(); i++)
                //    {
                //        int k = 0;
                //        ;
                //    }
                //}

                //match_r(str, pos, r, _min, _max);
            }
            void match_r(const std::string & str, int pos, regex_result & r, unsigned int mn, unsigned int mx) const
            {
                if (mx > 0)
                {
                    //regex_result r1;
                    //_rx.match(str, pos, r1);
                    //for (int i = 0; i < (int)r1.matches.size(); i++)
                    //{
                    //    regex_result r2;
                    //    match_r(str, pos + r1.matches[i].second, r2, mn > 0 ? mn - 1 : 0, mx - 1);
                    //    if (mn <= 1)
                    //    {
                    //        r.add(pos, r1.matches[i].second);
                    //    }
                    //    for (int j = 0; j < (int)r2.matches.size(); j++)
                    //    {
                    //        r.add(pos, r1.matches[i].second + r2.matches[j].second);
                    //    }
                    //}
                }
            }
        };
    }
}